#ifndef DATABASE_H
#define DATABASE_H

#include "..\TabelPMK\TabelPMK.h"
#include "..\Edge\Edge.h"

// INSERT SINGLE RECORD
/**********************************************************************************
	Semua fungi di bawah ini melakukan hal yang sama :
	Menginsert satu record ke database jika from terhubung ke to
	I.S. : 	Mhs, MK,atau PMK sudah dialokasi
	F.S. : 	out_time berisi waktu yang diperlukan untuk menginsert, out_shortest path berisi jalur terpendek. 
			return true jika berhasil memasukkan
**********************************************************************************/ 
bool InsertRecordMhs(AddressMhs Mhs, TabelMhs *TMhs, nodeAddress to, nodeAddress from, edgeList Graph, float *out_time, char *out_shortestpath);
bool InsertRecordMK(AddressMK MK, TabelMK *TMK, nodeAddress to, nodeAddress from, edgeList Graph, float *out_time, char *out_shortestpath);
bool InsertRecordPMK(AddressPMK PMK, TabelPMK *TPMK, nodeAddress to, nodeAddress from, edgeList Graph, float *out_time, char *out_shortestpath);

// DELETE SINGLE RECORD
/**********************************************************************************
	Semua fungi di bawah ini melakukan hal yang sama :
	Menghapus satu record dan replikasi-replikasinya dari database
	I.S. : 	Mhs, MK,atau PMK sudah dialokasi
	F.S. : 	del_time berisi waktu yang diperlukan untuk mendelete, 
			RecordCount berisi banyaknya record dan replikasinya yang didelete 
**********************************************************************************/ 
void DeleteRecordMhs(AddressMhs Mhs, TabelMhs *TMhs, TabelPMK *TPMK, float *del_time, int *MhsRecordCount);
void DeleteRecordMK(AddressMK MK, TabelMK *TMK, TabelPMK *TPMK, float *del_time, int *MKRecordCount);
void DeleteRecordPMK(AddressPMK PMK, TabelPMK *TPMK, float *del_time, int *PMKRecordCount);

// UPDATE SINGLE RECORD
/**********************************************************************************
	Semua fungi di bawah ini melakukan hal yang sama :
	Mengupdate satu record dari database
	I.S. : 	Mhs, MK,atau PMK sudah dialokasi
	F.S. : 	out_time berisi waktu yang diperlukan untuk mengupdate, 
			out_count berisi banyaknya record dan replikasinya yang diupdate 
**********************************************************************************/ 
void UpdateRecordMhs(AddressMhs Mhs, string NIMbaru, string namaBaru, date TglLahirBaru, string KotaAsalBaru, int *out_count, float *out_time);
void UpdateRecordMK(AddressMK MK, string kodeBaru, string namaBaru, int SKSBaru, string bidangBaru, int *out_count, float *out_time); 
void UpdateRecordPMK(AddressPMK PMK, AddressMhs MhsBaru, AddressMK MKBaru, int semesterBaru, ThnAkademik TABaru, char nilaiBaru, int *out_count, float *out_time);

// RETRIEVE SINGLE RECORD
/**********************************************************************************
	Semua fungi di bawah ini melakukan hal yang sama :
	Meretrieve satu record dari database
	I.S. : 	Mhs, MK,atau PMK sudah dialokasi
	F.S. : 	out_retrievetime berisi waktu terbaik yang diperlukan untuk meretrieve 
			out_shortestpath berisi jalan terbaik 
**********************************************************************************/ 
void RetrieveRecordMhs(AddressMhs Mhs, nodeAddress from, edgeList Graph, char *out_shortestpath, float *out_retrievetime);
void RetrieveRecordMK(AddressMK MK, nodeAddress from, edgeList Graph, char *out_shortestpath, float *out_retrievetime);
void RetrieveRecordPMK(AddressPMK PMK, nodeAddress from, edgeList Graph, char *out_shortestpath, float *out_retrievetime);

#endif

